/*
 * utilities.h
 *
 *  Created on: Feb 27, 2012
 *      Author: francesco
 */

#ifndef UTILITIES_H_
#define UTILITIES_H_

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>

#define NUMERICMAX(x,y) ( ((x)>(y)) ? (x) : (y) )
#define NUMERICMIN(x,y) ( ((x)>(y)) ? (y) : (x) )

/**
 * @brief Definisce una struttura per gli array dinamici.
 *
 * Array può essere ordinato o non a seconda se si assegna un valore
 * al puntatore a funzione <code>cmpElem</code>.
 *
 * @see addElementToDynArray funzione che gestisce l'aggiunta di elementi all'array.
 */
typedef struct descDynArray {
	int numelement;
	int sizeSingleElem;
	void* elemBuff;
	int (*cmpElem)(const void*,const void*);
} DynArray;

int addElementToDynArray(DynArray * arr, void * elem);

int removeElementFromDynArray(DynArray * arr, void * elem);

void * getElementFromDynArray(DynArray * arr, const void * index);

/**
 * @brief Permette di utilizzare un tipo di dato nascosto e che quindi può variare in base alle necessità.
 *
 * Meccanismo: l'utilizzatore definisce una variabile di questo tipo e assegna un valore al campo hiddentype
 * rappresentate il vero contenuto, cioè quindi i dati necessari per poter interpretare una variabile.
 * Insieme ai dati definisce anche l'interpreter cioè un metodo per poter dare un significato al valore della
 * variabile.
 * Il valore potrebbe cambiare in base al contesto applicativo perciò il metodo interpreter prende due argomenti
 * il primo che è generalmente l'hiddentype stesso e il secondo che rappresenta il contesto.
 *
 * @param hiddentype può essere un puntatore a funzione di qualsiasi forma.
 * @param interpretfnc permette di ottenere un valore valido in base al contesto.
 *
 * @see getHiddenTypeToString esempio di interpreter generalmente utilizzato per ottere le informazioni sui comandi.
 */
typedef struct hiddenType {
	void * hiddentype;
	void * (*interpretfnc)(void*,void*); // primo valore è la stessa hiddentype il secondo è il contesto.
} HiddenType;

void * HiddenType_executeInterpreter(HiddenType* ht, void * context);

char* getHiddenTypeToString(void * value, void * context);

void logsimplefunction(char*h);

int getFirstWord(const char * sourceStr,char * destStr, char * separatorC);

char *getMultipleStrCat (char *String1, ...);

#endif /* UTILITIES_H_ */
